package my.mark.mybaibaoxiang.juc.biji02.lock;

/**
 * 锁的粗化
 * 锁的消除
 */
public class Test {
    StringBuffer stb = new StringBuffer();


    public void test1(){
        //jvm的优化，锁的粗化
        /**
         * append加锁加在stb当前实例对象上。
         * 此处调用四次append理论则会加四次锁，但JVM会对其进行优化，将四次调用放在一个加锁里,
         * 即相当于用synchronized将四个调用包含到一起，加一次锁。锁粒度放大了，即锁的粗化。
         */
        stb.append("1");

        stb.append("2");

        stb.append("3");

        stb.append("4");
    }

    /**
     * 锁的消除
     */
    public void test2(){
        //jvm的优化，JVM不会对同步块进行加锁
        //TODO 由于锁对象每次都是new Object()，每个线程都是新的，互相之间无法感知关联。逃逸分析优化之后便不会加锁。
        synchronized (new Object()) {
            //伪代码：很多逻辑
            //jvm是否会加锁？
            //jvm会进行逃逸分析
        }
    }

    public static void main(String[] args) {
        Test test = new Test();
    }
}
